#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <dlfcn.h>
#include <pthread.h>
#include <linux/fb.h>

struct img_info
{
    int width;
    int height;
    int bpp;
    int size;
    char *rgb; // rgb的存储入口
};


#include "lcd.h"

enum imgfmt{JPG, BMP, PNG};

int main(int argc, char const *argv[]) // ./a.out x.jpg/x.bmp
{
    if(argc != 2)
    {
        printf("请指定一张图片\n");
        exit(0);
    }

    // 1. 准备LCD
    struct lcd_info lcdinfo;
    init_lcd(&lcdinfo);

    // 2. 判定图片格式
    enum imgfmt fmt;
    if(strstr(argv[1], ".jpg") || strstr(argv[1], ".jpeg"))
        fmt = JPG;
    else if(strstr(argv[1], ".bmp"))
        fmt = BMP;

    void *so;

    // 3. 加载对应的动态库
    switch(fmt)
    {
    case JPG:
        so = dlopen("libjpg.so", RTLD_NOW);
        break;
    case BMP:
        so = dlopen("libbmp.so", RTLD_NOW);
        break;
    }
    if(so == NULL)
    {
        printf("加载动态库失败：%s\n", dlerror());
        exit(0);
    }

    // 4. 查找图片显示的函数
    void (*show_img)(struct lcd_info *lcdinfo, const char *filename);
    show_img = dlsym(so, "show_img");
    if(show_img == NULL)
    {
        printf("查找函数接口失败：%s\n", dlerror());
        exit(0);
    }
    show_img(&lcdinfo, argv[1]);

    // 5. 释放资源
    // release_img(&imginfo);
    // release_lcd(&lcdinfo);

    return 0;
}
